package ml.kupin.cart.service.impl;

import com.alibaba.fastjson.JSON;
import ml.kupin.cart.service.CartService;
import ml.kupin.common.jedis.JedisClient;
import ml.kupin.common.utils.KuPinResult;
import ml.kupin.mapper.TbItemMapper;
import ml.kupin.pojo.TbItem;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by 小柯(Allen Kerr) on 17.5.7 22:28.
 */
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private JedisClient jedisClient;
    @Value("${cart_redis_prefix}")
    private String cart_redis_prefix;
    @Autowired
    private TbItemMapper itemMapper;

    /**
     * 更新redis中与userId对应的购物车列表
     *
     * @param userId
     * @param itemId
     * @param itemNum
     * @return
     */
    @Override
    public KuPinResult addCartItem(Long userId, Long itemId, int itemNum) {
        //redis中购物车使用hash，key为Cart:userId，field为itemId，value为item转换的json字符串
        String json = jedisClient.hget(cart_redis_prefix + userId, itemId.toString());
        //判断结果
        if (StringUtils.isNotBlank(json)) {
            //不为空，购物车中已有将要添加的商品
            TbItem item = JSON.parseObject(json, TbItem.class);
            item.setNum(item.getNum() + itemNum);
            //重新存入redis中
            jedisClient.hset(cart_redis_prefix + userId, itemId.toString(), JSON.toJSONString(item));
            return KuPinResult.ok();
        }
        //为空，购物车中没有将要添加的商品
        TbItem item = itemMapper.selectByPrimaryKey(itemId);
        //取一张图片
        String image = item.getImage();
        if (StringUtils.isNotBlank(image)) {
            item.setImage(image.split(",")[0]);
        }
        //设置商品数量
        item.setNum(itemNum);
        //存入redis中
        jedisClient.hset(cart_redis_prefix + userId, itemId.toString(), JSON.toJSONString(item));
        return KuPinResult.ok();
    }

    /**
     * 获取redis中与userId对应的购物车列表
     *
     * @param userId
     * @return
     */
    @Override
    public List<TbItem> getCartItemList(Long userId) {
        //从redis中获取购物车列表
        List<String> hvals = jedisClient.hvals(cart_redis_prefix + userId);
        //遍历，转换
        List<TbItem> cartItemList = new ArrayList<>();
        for (String json : hvals) {
            TbItem item = JSON.parseObject(json, TbItem.class);
            cartItemList.add(item);
        }
        //返回结果
        return cartItemList;
    }

    /**
     * 合并cookie中的购物车列表和redis中与userId对应的购物车列表
     *
     * @param userId
     * @param cartItemList
     * @return
     */
    @Override
    public KuPinResult mergeCart(Long userId, List<TbItem> cartItemList) {
        //遍历商品列表，把列表添加到购物车中去，判断购物车中是否有此商品，
        //如果有，数量相加；如果没有添加新的商品
        //可以调用addCartItem方法进行处理
        for (TbItem item : cartItemList) {
            addCartItem(userId, item.getId(), item.getNum());
        }
        return KuPinResult.ok();
    }

    /**
     * 更新redis中与userId对应的购物车中的商品数量
     *
     * @param userId
     * @param itemId
     * @param itemNum
     * @return
     */
    @Override
    public KuPinResult updateCartItemNum(Long userId, Long itemId, int itemNum) {
        String json = jedisClient.hget(cart_redis_prefix + userId, itemId.toString());
        if (StringUtils.isNotBlank(json)) {
            TbItem item = JSON.parseObject(json, TbItem.class);
            //重设购买数量
            item.setNum(itemNum);
            jedisClient.hset(cart_redis_prefix + userId, itemId.toString(), JSON.toJSONString(item));
            return KuPinResult.ok();
        }
        return KuPinResult.notOk();
    }

    /**
     * 删除redis中与userId对应的购物车中的商品
     *
     * @param userId
     * @param itemId
     * @return
     */
    @Override
    public KuPinResult deleteCartItem(Long userId, Long itemId) {
        jedisClient.hdel(cart_redis_prefix + userId, itemId.toString());
        return KuPinResult.ok();
    }

    /**
     * 清空购物车
     *
     * @param userId
     * @return
     */
    @Override
    public KuPinResult clearCart(Long userId) {
        jedisClient.del(cart_redis_prefix + userId);
        return KuPinResult.ok();
    }
}
